/************************************************************************
 * <br>
 * <ul>
 * <li>版权所有：唐山弘川科技有限公司 2009－2020</li>
 * <li>创建日期：2009-8-10</li>
 * <li>初始作者：刘川</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 ***********************************************************************/
package com.hy.enterprise.framework.persistence.domain.query ;

import java.util.Date;

import com.hy.enterprise.framework.persistence.domain.query.conditions.ConditionalExpression;
import com.hy.enterprise.framework.persistence.domain.query.internal.AliasFactory;

/**
 * <ul>
 * <li>设计作者：刘川</li>
 * <li>设计日期：2009-8-10</li>
 * <li>设计时间：下午03:54:17</li>
 * <li>设计目的：</li>
 * </ul>
 * <ul>
 * <b>修订历史</b>
 * <li>1、</li>
 * </ul>
 */
public class GroupByClause < S > extends AbstractClause implements
        ISubQuery < S >
{
	private final Object [ ]	groupers ;

	/**
	 * 构造函数
	 * 
	 * @param fromClause
	 * @param groupers
	 */
	public GroupByClause (
	                       FromClause < ? , S > fromClause ,
	                       Object [ ] groupers )
	{
		super (
		        fromClause ) ;
		this.groupers =
		                groupers ;
	}

	/**
	 * 构造函数
	 * 
	 * @param whereClause
	 * @param groupers
	 */
	public GroupByClause (
	                       WhereClause < S > whereClause ,
	                       Object [ ] groupers )
	{
		super (
		        whereClause ) ;
		this.groupers =
		                groupers ;
	}

	/**
	 * @see com.hy.enterprise.framework.persistence.domain.query.AbstractClause#addTo(java.lang.StringBuilder)
	 */
	@ Override
	StringBuilder addTo (
	                      StringBuilder stringBuilder )
	{
		stringBuilder
		             .append ( " GROUP BY " ) ;
		for ( int index =
		                  0 ; index < this.groupers.length ; index ++ )
		{
			Object grouper =
			                 this.groupers [ index ] ;
			stringBuilder
			             .append ( AliasFactory
			                                   .about (
			                                            grouper )
			                                   .getPreferredStringRepresentation ( ) ) ;
			if ( index < this.groupers.length - 1 )
			{
				stringBuilder
				             .append ( ", " ) ;
			}
		}
		return stringBuilder ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:50:05</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param conditionalExpression
	 * @return
	 */
	public HavingClause < S > having (
	                                   ConditionalExpression conditionalExpression )
	{
		return new HavingClause < S > (
		                                this ,
		                                conditionalExpression ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:48:50</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param character
	 * @return
	 */
	public OrderByClause orderBy (
	                               Character character )
	{
		return this
		           .orderBy (
		                      character ,
		                      SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:48:46</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param character
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause orderBy (
	                               Character character ,
	                               SortDirection sortDirection )
	{
		return new OrderByClause (
		                           this ,
		                           character ,
		                           sortDirection ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:49:33</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param date
	 * @return
	 */
	public OrderByClause orderBy (
	                               Date date )
	{
		return this
		           .orderBy (
		                      date ,
		                      SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:49:25</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param date
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause orderBy (
	                               Date date ,
	                               SortDirection sortDirection )
	{
		return new OrderByClause (
		                           this ,
		                           date ,
		                           sortDirection ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:49:58</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param number
	 * @return
	 */
	public OrderByClause orderBy (
	                               Number number )
	{
		return this
		           .orderBy (
		                      number ,
		                      SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:49:48</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param number
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause orderBy (
	                               Number number ,
	                               SortDirection sortDirection )
	{
		return new OrderByClause (
		                           this ,
		                           number ,
		                           sortDirection ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:49:12</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param string
	 * @return
	 */
	public OrderByClause orderBy (
	                               String string )
	{
		return this
		           .orderBy (
		                      string ,
		                      SortDirection.ASC ) ;
	}

	/**
	 * <ul>
	 * <li>设计作者：刘川</li>
	 * <li>设计日期：2009-8-10</li>
	 * <li>设计时间：下午04:49:03</li>
	 * <li>设计目的：</li>
	 * </ul>
	 * <ul>
	 * <b>修订历史</b>
	 * <li>1、</li>
	 * </ul>
	 * 
	 * @param string
	 * @param sortDirection
	 * @return
	 */
	public OrderByClause orderBy (
	                               String string ,
	                               SortDirection sortDirection )
	{
		return new OrderByClause (
		                           this ,
		                           string ,
		                           sortDirection ) ;
	}
}
